10814번 나이순 정렬
Day15 13단계 20231109
- 내 풀이 : 입력 받은 문자열을 String 2차 배열에 각각 나이와 이름을 분리해서 저장하고, sort()의 Comparator를 나이 순서대로 정렬 시켰다.
- 나이가 같은 경우엔 먼저 입력으로 들어온 배열 요소가 인덱스 상 어차피 앞서기 때문에 나이에 대해서만 정렬해주었다.
- 정렬 후에는 배열의 모든 요소를 나이 + 이름 조합으로 BufferedWriter의 write()를 사용해 출력했다.
- 이 코드는 처리 시간이 778 ms 걸린다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
String[][] strArr = new String[n][2];
for(int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
strArr[i][0] = st.nextToken();
strArr[i][1] = st.nextToken();
}
Arrays.sort(strArr, (a, b) -> {return Integer.parseInt(a[0]) - Integer.parseInt(b[0]);});
for(int i = 0; i < strArr.length; i++) {
bw.write(strArr[i][0] + " " + strArr[i][1] +"\n");
}
bw.flush();
bw.close();
br.close();
}
}
- 다른 사람의 풀이 : String 배열 대신 StringBuilder 배열(!)을 만들었고, 배열의 크기는 문제에서 최고 나이인 200+1로 설정했다.
- 코드 처리 시간이 무려 444 ms, 512 ms이다. StringBuilder 배열을 사용하는 것이 일반 String 배열을 사용한 것보다 빠르다는 것을 알 수 있다.
- https://www.acmicpc.net/source/68959110, https://www.acmicpc.net/source/68694600
- 카운트 정렬 10989번 수 정렬하기 3 방법을 사용
- StringBuilder로 배열을 만들 수 있음을 처음 배웠다(StringBuffer와 StringBuilder 클래스)
- 배열에 각각의 StringBuilder 객체를 넣고, 입력이 들어오면 먼저 나이에 해당하는 인덱스 위치의 StringBuilder를 호출하고, 그 StringBuilder로 나이와 이름을 append()한다.
- 나이가 같다면 먼저 들어온 순서대로 StringBuilder에 append()되고, 나이가 다르면 다른 StringBuilder 배열 인덱스 위치에 저장된다.
- 최종 결과물을 새 StringBuilder로 작성하여 print()했다.
- 아래는 다른 사람의 코드에서 출력 부분만 BufferedWriter로 테스트해보기 위해 변경한 코드이다.
- Arrays.fill()를 사용할 때 Object 배열의 경우엔 같은 객체가 복사되어 저장된다는 점을 주의해야 한다.(Arrays 클래스)
- 이 코드의 처리 속도는 560 ms이다.
- BufferedWriter로 stb[i].toString()를 일일이 write()하는게 새 StringBuilder로 전체를 append()해서 출력하는 것보다 더 시간 손해임을 알 수 있다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
// https://www.acmicpc.net/source/68959110 내용 참고 및 테스트를 위한 수정
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
StringBuilder[] stb = new StringBuilder[201];
for(int i = 0; i < stb.length; i++) {
stb[i] = new StringBuilder();
}
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int age = Integer.parseInt(st.nextToken());
stb[age].append(age + " " + st.nextToken() + "\n");
}
for(StringBuilder sb : stb) {
bw.write(sb.toString());
}
bw.flush();
bw.close();
br.close();
}
}